En este Notebook vamos a analizar los datos que hemos obtenido de los datasets originales de las tiendas de Google y Apple.
Recordemos que partíamos de dos datasets:
Estas cantidades de datos eliminados pueden parecer muy altas, pero debemos tener en cuenta que todos los datos fueron obtenidos por medio de Web Scraping, y que además establecimos criterios muy específicos para filtrar los datos, de manera que las Apps resultantes fueran comparables a la que queremos lanzar al mercado.
Las Apps que tenemos disponibles cumplen con los siguientes criterios:
Nuestro principal objetivo será encontrar las categorías mejor valoradas por los usuarios, o que creamos que por algún motivo gozan de popularidad.
No podemos guiarnos únicamente por las valoraciones de los usuarios, porque tenemos que tener en cuenta que no todos los usuarios satisfechos escriben una reseña o valoran su producto. De hecho, existe una tendencia natural a valorar las experiencias negativas, y a no valorar las positivas, por lo que una App con buenas valoraciones la tomaremos como que es excepcional, mientras que una App con valoraciones medias negativas, tendremos que estudiar un poco más a fondo a qué es debido.
También estudiaremos otra serie de variables que podrían ser interesantes para planificar el lanzamiento de la App.
Las fechas podrían ser importantes, es posible que los usuarios tiendan a descargar e instalar más Apps en meses concretos del año, y esto podría ser un dato jugoso para obtener rentabilidad. No tenemos que estudiarlo necesariamente, pero llegado el caso, y si necesitamos un análisis más profundo por falta de información, podremos plantearnos analizar estas variables.
También podemos estudiar qué tipo de Apps son más populares en función del público al que van dirigido, para poder encontrar un hueco muy específico en el mercado.
Podemos también obtener información sobre desarrolladores de Apps para tomarlos como referencia. Por ejemplo, podríamos descubrir que cierto desarrollador que tiene varias Apps en el mercado tiene unas valoraciones medias inferiores a la media total, y sería una buena opción estudiar las Apps de este desarrollador para evitar tomarlo como referencia. Por supuesto, también se podría dar el caso opuesto (desarrolladores muy bien valorados en relación a la media).
Como vemos, existen múltiples casos que podemos estudiar para encontrar las condiciones óptimas de entrada en el mercado. Aunque todo esto son hipótesis, trataremos de que sean los datos los que nos guíen a través del proceso.
Una opción que podría ser interesante sería combinar ambos datasets en uno solo para estudiarlo, pero existen varios inconvenientes:
Por estos dos inconvenientes, hemos preferido mantener los dos datasets por separado, y de hecho puede ser interesante comprobar las diferencias (o lo que sería mejor, las similtudes) de ambas tiendas de forma individual.
Todos los análisis los realizaremos sobre ambos conjuntos de datos, excepto análisis más específicos de ciertas variables que solo se encuentren disponibles en uno de los datasets.
Vamos a realizar las importaciones y a realizar las configuraciones típicas para el Notebook:
import pandas as pd
import numpy as np
import plotly
plotly.offline.init_notebook_mode()
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
%matplotlib inline
sns.set(color_codes = True)
pd.set_option('display.max_columns', None)
pd.set_option('display.float_format', lambda x: '%.3f' % x)
pd.options.mode.chained_assignment = None
from IPython.core.display import HTML
HTML("""
<style>
.output_png {
display: table-cell;
text-align: center;
margin:auto;
}
.prompt
display:none;
}
}
</style>
""")
Vamos a leer los datasets que hemos construido:
# Leemos ambos datasets con Pandas
apple = pd.read_csv('clean_apple.csv')
google = pd.read_csv('clean_google.csv')
# Aspecto de los DataFrames
apple.head()
google.head()
Antes de empezar a realizar las visualizaciones, vamos a estandarizar las Categorías de Apps presentes en cada uno de los datasets.
Las distintas Categorías de Apps en cada uno de los datasets son las siguientes:
# Número de categorías únicas en el dataset de Apple
len(apple.primary_genre.unique())
# Categorías de Apps en el dataset de Apple
print(apple.primary_genre.unique())
# Número de categorías únicas en el dataset de Google
len(google.category.unique())
# Categorías de Apps en el dataset de Google
print(google.category.unique())
Tenemos exactamente el doble de categorías en los datos de Google, lo que dificultaría los análisis y los haría difícil de comprender para el cliente.
Para facilitar los análisis y las visualizaciones, lo que haremos será crear una nueva columna en el dataset de Google, a la que llamaremos subcategory, que será la equivalente a la columna all_genres del dataset de Apple. Esta nueva columna albergará los valores que actualmente tiene la columna category, ya que los valores por defecto de esta columna son en realidad subcategorías. Podemos comprobar esto con la categoría 'Juegos', por ejemplo. En el dataset de Apple, existe una categoría general que engloba todas las Apps de juegos y videojuegos, llamada Games; sin embargo en el dataset de Google existen múltiples categorías de Apps de juegos y videojuegos: Arcade, Adventure, Action, Board, Racing, etc. Esto también ocurre con otras categorías.
Hemos tenido que realizar un análisis manual de todas estas categorías, que no vamos a plasmar aquí para no alargar el Notebook de manera innecesaria. Directamente crearemos la nueva columna subcategory y modificaremos la columna category y realizaremos algunas modificaciones en las Categorías de Apps del dataset de Apple, con el objetivo de que las Categorías principales de las Apps sean las mismas en ambos datasets. Por supuesto, si quisiéramos profundizar en alguna Categoría concreta, siempre tendremos disponible las columnas subcategory en los datos de Google y all_genres en los datos de Apple.
# Creamos la nueva columna 'subcategory' en el DataFrame de Google
google['subcategory'] = google['category']
# Estandarizamos las Categorías en ambos DataFrames
google['category'][google.category == 'Communication'] = 'Stickers'
google['category'][google.category == 'Maps & Navigation'] = 'Navigation'
google['category'][google.category == 'Social'] = 'Social Networking'
# Creamos la nueva columna 'subcategory'
google['subcategory'] = google['category']
# Estandarizamos los valores de la columna 'category'
games = ['Casual', 'Arcade', 'Puzzle', 'Simulation', 'Action', 'Adventure',
'Trivia', 'Racing', 'Role Playing', 'Board', 'Strategy', 'Card',
'Word', 'Auto & Vehicles', 'Casino']
google['category'][google.category.isin(games)] = 'Games'
lifestyle = ['Lifestyle', 'Dating', 'House & Home', 'Parenting']
google['category'][google.category.isin(lifestyle)] = 'Lifestyle'
utilities = ['Tools', 'Personalization']
google['category'][google.category.isin(utilities)] = 'Utilities'
entertainment = ['Entertainment', 'Art & Design']
google['category'][google.category.isin(entertainment)] = 'Entertainment'
education = ['Education', 'Educational']
google['category'][google.category.isin(education)] = 'Education'
photo_video = ['Photography', 'Video Players & Editors']
google['category'][google.category.isin(photo_video)] = 'Photo & Video'
travel = ['Travel & Local', 'Events']
google['category'][google.category.isin(travel)] = 'Travel'
health = ['Health & Fitness', 'Beauty']
google['category'][google.category.isin(health)] = 'Health & Fitness'
music = ['Music', 'Music & Audio']
google['category'][google.category.isin(music)] = 'Music'
books = ['Books & Reference', 'Comics']
google['category'][google.category.isin(books)] = 'Books & Reference'
# Apple
books_ref = ['Book', 'Reference']
apple['primary_genre'][apple.primary_genre.isin(books_ref)] = 'Books & Reference'
news = ['News', 'Magazines & Newspapers']
apple['primary_genre'][apple.primary_genre.isin(news)] = 'News & Magazines'
# Eliminamos la columna 'Libraries & Demo' de Google, por incluir muchas Demos (productos no terminados)
google = google.drop(google[google.category == 'Libraries & Demo'].index)
# Comprobamos los resultados
print(f'- Número de categorías únicas en la columna "category" (Google): {len(google.category.unique())}')
print(f'- Número de categorías únicas en la columna "subcategory" (Google): {len(google.subcategory.unique())}')
print(f'- Número de categorías únicas en la columna "primary_genre" (Apple): {len(apple.primary_genre.unique())}')
Ahora tenemos el mismo número de Categorías principales en ambos DataFrames, y las hemos renombrado para poder realizar comparaciones entre tiendas.
Antes de realizar las conversiones, hemos sido lo más rigurosos y cuidadosos posible, asegurándonos de cada Categoría incluyese las Apps correspondientes en el otro dataset.
Como hemos dicho, no vamos a extendernos sobre estas operaciones, pero queremos dejar constancia de que nos hemos tomado el tiempo necesario antes de realizar los cambios.
Ahora sí podemos empezar a realizar visualizaciones e incluso comparar Categorías entre ambas tiendas.
A lo largo de todo el Notebook, utilizaremos el color azul para representar la Apple App Store y verde para representar la Google Play Store, porque nos ha parecido que puede resultar intuitivo para el cliente, ya que el logo de la tienda de Apple es azul, y el robot del logo de Android es verde.
Vamos a realizar unas cuantas visualizaciones sobre las Categorías de Apps.
Queremos conocer:
Vamos a mostrar cuantas Apps existen de cada Categoría.
La información que nos aportará este gráfico será cuales son las Categorías con mayor número de Apps en el mercado.
En general, no nos interesará entrar en un mercado que esté muy poblado, más bien lo que nos interesaría sería encontrar un mercado relativamente despoblado pero bien valorado por los usuarios.
# Creamos dos subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))
# Agregamos los traces
fig.append_trace(go.Bar(x = apple['primary_genre'].value_counts().index,
y = apple['primary_genre'].value_counts(),
marker_color = 'blue',
name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = google['category'].value_counts().index,
y = google['category'].value_counts(),
marker_color = 'green',
name = 'Google Play'), row=2, col=1)
# Giramos los x-axes para una mejor visualización
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)
# Título y tamaño del plot
fig.update_layout(showlegend=False,
title_text='Número de Apps totales por Categorías',
height=1000, width=800)
fig.show()
En ambos datasets la Categoría Juegos es la más popular.
Llama especialmente la atención que en la App Store triplica la cantidad de la segunda Categoría más popular, Educación, y cuadriplica la de la tercera, Entretenimiento. Esta última también es muy popular en la Google Play Store (tercera Categoría más popular), siendo Utilidades la segunda.
CATEGORÍAS MÁS POPULARES:
CATEGORÍAS MENOS POPULARES:
Vamos a ver los ratings medios por cada Categoría (nota media que han recibido las Apps de los usuarios por Categoría, de 0 a 5).
# App Store: agrupamos por categoría
valoracion_categoria_apple = apple.groupby('primary_genre').mean()['total_average_rating'].sort_values(ascending=False)
# Google Play Store: agrupamos por categoría
valoracion_categoria_google = google.groupby('category').mean()['rating'].sort_values(ascending=False)
# Dos subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))
# Dos traces
fig.append_trace(go.Bar(x = valoracion_categoria_apple.index,
y = valoracion_categoria_apple,
marker_color = 'blue',
name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = valoracion_categoria_google.index,
y = valoracion_categoria_google,
marker_color = 'green',
name = 'Google Play'), row=2, col=1)
# Giramos los ejes X
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)
# Ajustamos los ejes Y para una mejor visualización
fig.update_yaxes(row=1, col=1, range=[3, 4.1])
fig.update_yaxes(row=2, col=1, range=[3.8, 4.3])
# Título y tamaño del plot
fig.update_layout(showlegend=False,
title_text='Valoración Media por Categorías',
height=1000, width=800)
fig.show()
Apple App Store: Finanzas, Libros y Negocios, las mejor valoradas en la App Store. Utilidades, Entretenimiento y Pegatinas, las peor valoradas, destacando sobre todo esta última, rozando un rating de 3,2.
Google Play Store: Médico, Música y Educación, las mejor valoradas. Navegación, Entretenimiento y Foto&Vídeo, las peores, con una diferencia pronunciada frente a las demás (estas tres categoriás están especialmente mal valoradas por los usuarios).
Como tenemos las mismas Categorías en ambos DataFrames, podemos juntar las valoraciones medias de cada tienda y ver el rating medio de cada Categoría en ambas tiendas.
valoracion_categoria_ambos = (valoracion_categoria_apple.sort_index() +
valoracion_categoria_google.sort_index()) / 2
valoracion_categoria_ambos.sort_values(ascending=False)
# Paleta de colores para hacer un efecto degradado
colores = ['#6B080C', '#6B080C', '#6B080C', '#6B080C', '#6B3E0C', '#6B3E0C', '#6B3E0C',
'#6B560C', '#6B560C', '#6B560C', '#6B760C', '#6B760C', '#6B760C',
'#6BA10C', '#6BA10C', '#6BA10C', '#6BD00C', '#6BD00C', '#6BD00C',
'#6BF20C', '#6BF20C', '#6BF20C']
# Figura de Plotly
fig = go.Figure()
# Trace (barras horizontales)
fig.add_trace(go.Bar(
y = valoracion_categoria_ambos.sort_values(ascending=True).index,
x = valoracion_categoria_ambos.sort_values(ascending=True),
marker_color = colores,
orientation='h'))
# Título, tamaño y adaptación del eje X
fig.update_layout(title='Valoración media por Categoría: ambas tiendas', height=800, width=800)
fig.update_xaxes(range=[3.5, 4.1])
fig.show()
Lo que hemos hecho es sumar los ratings de ambas tiendas y dividirlos entre dos. De esta manera obtenemos un rating medio de ambas tiendas.
CATEGORÍAS CON MEJOR RATING MEDIO:
CATEGORÍAS CON PEOR RATING MEDIO:
Vamos a filtrar únicamente las Apps cuyo rating sea igual o mayor a 4,5 sobre 5, que según los usuarios son las mejores Apps del mercado.
Mostraremos el número de Apps por Categoría que hay en este grupo:
# Apple - Apps con más de 4,5* (Categorías)
mas_valoradas_apple = apple[apple.total_average_rating > 4.4]
cat_mas_val_apple = mas_valoradas_apple.groupby('primary_genre')['total_average_rating'].count().sort_values(ascending=False)
# Google - Apps con más de 4,5* (Categorías)
mas_valoradas_google = google[google.rating > 4.4]
cat_mas_val_google = mas_valoradas_google.groupby('category')['rating'].count().sort_values(ascending=False)
# Hacemos dos subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))
# Dos traces
fig.append_trace(go.Bar(x = cat_mas_val_apple.index,
y = cat_mas_val_apple,
marker_color = 'blue',
name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = cat_mas_val_google.index,
y = cat_mas_val_google,
marker_color = 'green',
name = 'Google Play'), row=2, col=1)
# Configuramos los ejes
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)
fig.update_yaxes(row=1, col=1)
fig.update_yaxes(row=2, col=1)
# Título y tamaño
fig.update_layout(showlegend=False,
title_text="Número de Apps con 4'5* o más - Categorías",
height=1000, width=800)
fig.show()
Este gráfico nos muestra la cantidad de Apps que existen por cada Categoría, donde cada App tiene un rating de 4,5 o mayor.
En realidad, la información que nos ofrece no nos aporta valor, ya que hemos visto que efectivamente la Categoría Juegos es la más numerosa en ambos datasets, por lo que tiene sentido que también sea la que más presencia tiene entre las mejor valoradas.
Lo que sí nos puede aportar valor es la cantidad de Apps por Categoría existentes, según el valor esperado o esperanza matemática. Eso es lo que vamos a mostrar a continuación.
# Apple: porcentaje de Categorías en todo el dataset - VALOR ESPERADO
porc_apple_cat_dataset = apple.primary_genre.value_counts(normalize=True).sort_index()
# Apple: porcentaje de Categorías dentro de las más valoradas (4,5* o más) - VALOR REAL
porc_apple_cat_mas_val = mas_valoradas_apple.primary_genre.value_counts(normalize=True).sort_index()
# Apple: Valor Real Vs. Valor Esperado - Categorías
desempeno_cat_apple = porc_apple_cat_mas_val / porc_apple_cat_dataset
des_apple = (desempeno_cat_apple.sort_values(ascending=False) - 1)*100
# Google: porcentaje de Categorías en todo el dataset - VALOR ESPERADO
porc_google_cat_dataset = google.category.value_counts(normalize=True).sort_index()
# Google: porcentaje de Categorías dentro de las más valoradas (4,5* o más) - VALOR REAL
porc_google_cat_mas_val = mas_valoradas_google.category.value_counts(normalize=True).sort_index()
# Google: Valor Real Vs. Valor Esperado - Categorías
desempeno_cat_google = porc_google_cat_mas_val / porc_google_cat_dataset
des_google = (desempeno_cat_google.sort_values(ascending=False) -1)*100
Sabemos que el código de arriba es tedioso de leer, aunque hemos intentado nombrar a las variables de la manera más intuitiva y legible posible, pero la operación que acabamos de realizar es puro sentido común: el desempeño que hemos calculado arroja un valor que será cero como mínimo (si existiesen cero Apps de una Categoría concreta en el grupo de las más valoradas). Si el número de Apps que existen en este grupo de una Categoría concreta es el mismo que el número de Apps esperadas, la división daría 1 (un número entre sí mismo es 1), por lo que si restamos 1 obtenemos 0, que es el valor esperado (porcentaje de cambio real frente al porcentaje esperado = 0).
Por ejemplo, si tenemos un dataset con 100 Apps, y 40 de ellas son 'Juegos', imaginemos que elegimos las 10 Apps más valoradas: esperaríamos que hubiese 4 juegos (el 10% de 40). Si existen 4 juegos, el porcentaje de cambio es 0% (4/4 -1 100 = 0), mientras que si hay 5 juegos, el porcentaje de cambio es +25% ((5/4 -1) 100 = 25). En este caso, tendríamos una mejora real del 25% (5 Apps) frente al valor esperado (4 Apps).
Si a este resultado le multiplicamos 100, obtenemos porcentajes, que sí que nos aportan valor, porque podremos comprobar cuáles son realmente las Categorías que tienen una presencia mayor de la esperada entre las mejores Apps, y sabremos exactamente en qué proporción a través de los porcentajes que acabamos de calcular.
# Graficamos los resultados - Valor Real vs Valor Esperado en ambas tiendas
# Con np.where podemos crear una paleta automática de colores en función del valor:
# Si es positivo será verde, si es negativo será rojo
# Apple
graf_apple = pd.DataFrame(des_apple)
graf_apple['color'] = np.where(graf_apple < 0, 'red', 'green')
# Google
graf_google = pd.DataFrame(des_google)
graf_google['color'] = np.where(graf_google < 0, 'red', 'green')
# Subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))
# Traces
fig.append_trace(go.Bar(x = graf_apple.index,
y = graf_apple['primary_genre'],
marker_color = graf_apple['color'],
name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = graf_google.index,
y = graf_google['category'],
marker_color = graf_google.color,
name = 'Google Play'), row=2, col=1)
# Ejes
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)
fig.update_yaxes(row=1, col=1)
fig.update_yaxes(row=2, col=1)
# Título, subtítulo y tamaño
fig.update_layout(showlegend=False,
title_text="Valor Real Vs. Valor Esperado - Categorías <br><sup>Apps con 4'5* o más - Porcentaje de Categorías (Más es mejor)",
height=1000, width=800)
fig.show()
Las Categorías en color verde son las que tienen más Apps entre las más valoradas de las que cabría esperar según su esperanza matemática, y en color rojo las que tienen menos Apps que su esperanza matemática.
En resumen:
APPLE APP STORE:
GOOGLE PLAY STORE:
Categorías a destacar:
Las Categorías de tipo Médico, Comida y Bebida, Libros y Referencia y Shopping tuvieron unas valoraciones muy positivas en ambas tiendas.
Las Categorías Navegación, Entretenimiento, El Tiempo y Foto y Vídeo tuvieron valoraciones negativas o muy negativas en ambas tiendas.
El resto de Categorías tuvieron unas valoraciones rondando su valor esperado entre ambas tiendas, si bien algunas destacaron positivamente como Viajes, o negativamente como Productividad.
Vamos a ver esto de manera más detallada en el siguiente gráfico
Como tenemos las Categorías homogeneizadas en ambos DataFrames, podemos sumar los resultados de cada Store que hemos obtenido para las Categorías y dividirlos entre dos, de esta manera obtendremos el porcentaje de Valor Real vs Valor Esperado global para todas las Categorías:
# Apple: ordenamos los índices para sumar entre ambas tiendas
des_apple.sort_index()
# Google: ordenamos los índices para sumar entre ambas tiendas
des_google.sort_index()
# Sumamos los valores y dividimos entre dos para obtener la media; después ordenamos de mayor a menor
des_global = (des_apple.sort_index() + des_google.sort_index()) / 2
des_global = des_global.sort_values(ascending=False)
des_global
# Visualizamos los resultados
# Paleta de colores para hacer un efecto degradado
colores = ['#6BF20C', '#6BF20C', '#6BF20C', '#6BD00C', '#6BD00C', '#6BD00C',
'#6BA10C', '#6BA10C', '#6BA10C', '#6B760C', '#6B760C', '#6B760C',
'#6B560C', '#6B560C', '#6B560C', '#6B3E0C', '#6B3E0C', '#6B3E0C',
'#6B3E0C', '#6B080C', '#6B080C', '#6B080C']
# Figura de Plotly
fig = go.Figure()
# Trace (barras horizontales)
fig.add_trace(go.Bar(
y = des_global.index,
x = des_global,
marker_color = colores,
orientation='h'))
# Título, tamaño y adaptación del eje X
fig.update_layout(title='Valor Real Vs. Valor Esperado - Categorías (más de 4,5 de rating) <br><sup>Rendimiento total por Categorías en Ambas Stores- Porcentajes (Más es mejor)', height=800, width=800)
fig.show()
Las Categorías Apps que tuvieron más presencia de la esperada entre las mejores fueron:
Las peores:
Directamente mostraremos las Categorías de Apps según su valor esperado, ya que —como dijimos— los valores absolutos no nos aportan valor.
# Apple - Apps con menos de 2,5 de rating (Categorías)
menos_valoradas_apple = apple[apple.total_average_rating < 2.5]
cat_menos_val_apple = menos_valoradas_apple.groupby('primary_genre')['total_average_rating'].count().sort_values(ascending=False)
# Google - Apps con menos de 2,5 de rating (Categorías)
menos_valoradas_google = google[google.rating < 2.5]
cat_menos_val_google = menos_valoradas_google.groupby('category')['rating'].count().sort_values(ascending=False)
# Apple: porcentaje de Categorías en todo el dataset - VALOR ESPERADO
porc_apple_cat_dataset = apple.primary_genre.value_counts(normalize=True).sort_index()
# Apple: porcentaje de Categorías dentro de las más valoradas (2,5* o más) - VALOR REAL
porc_apple_cat_menos_val = menos_valoradas_apple.primary_genre.value_counts(normalize=True).sort_index()
# Apple: Valor Real Vs. Valor Esperado - Categorías
desempeno_cat_apple_menos_2_stars = porc_apple_cat_menos_val / porc_apple_cat_dataset
des_apple_menos_2_stars = (desempeno_cat_apple_menos_2_stars.sort_values(ascending=True) - 1)*100
# Google: porcentaje de Categorías en todo el dataset - VALOR ESPERADO
porc_google_cat_dataset = google.category.value_counts(normalize=True).sort_index()
# Google: porcentaje de Categorías dentro de las más valoradas (4,5* o más) - VALOR REAL
porc_google_cat_menos_val = menos_valoradas_google.category.value_counts(normalize=True).sort_index()
# Google: Valor Real Vs. Valor Esperado - Categorías
desempeno_cat_google_menos_2_stars = porc_google_cat_menos_val / porc_google_cat_dataset
des_google_menos_2_stars = (desempeno_cat_google_menos_2_stars.sort_values(ascending=True) -1)*100
# Graficamos los resultados
# Apple
graf_apple_menos_2_stars = pd.DataFrame(des_apple_menos_2_stars)
graf_apple_menos_2_stars['color'] = np.where(graf_apple_menos_2_stars < 0, 'green', 'red')
# Google
graf_google_menos_2_stars = pd.DataFrame(des_google_menos_2_stars)
graf_google_menos_2_stars['color'] = np.where(graf_google_menos_2_stars < 0, 'green', 'red')
# Subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))
fig.append_trace(go.Bar(x = graf_apple_menos_2_stars.index,
y = graf_apple_menos_2_stars['primary_genre'],
marker_color = graf_apple_menos_2_stars['color'],
name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = graf_google_menos_2_stars.index,
y = graf_google_menos_2_stars['category'],
marker_color = graf_google_menos_2_stars.color,
name = 'Google Play'), row=2, col=1)
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)
fig.update_yaxes(row=1, col=1)
fig.update_yaxes(row=2, col=1)
fig.update_layout(showlegend=False,
title_text="Valor Real Vs. Valor Esperado - Categorías <br><sup>Apps con 2'5* o menos - Porcentaje de Categorías (Menos es mejor)",
height=1000, width=800)
fig.show()
En este caso, cuantas menos porcentaje de Apps existan entre las peor valoradas por los usuarios (en relación al valor esperado) el resultado es mejor. Por ejemplo, siguiendo con el ejemplo que pusimos anteriormente, si tengo un dataset con 100 Apps, de las cuales 40 son Juegos, y elijo las 20 peor valoradas (20% de Apps totales), esperaríamos que 8 de ellas sean Juegos (20% del total de Juegos). Si en vez de 8 —esperanza matemática— solamente hay 5, eso quiere decir que las Apps de Juegos están mejor valoradas en general que su valor esperado.
En este caso, las Categorías con mejor comportamiento en este sentido fueron:
Mejores y Peores Categorías de Apps en la App Store en relación al valor esperado (menos de 2,5 de rating):
Mejores y Peores Categorías de Apps en la tienda Google Play en relación al valor esperado (menos de 2,5 de rating):
En este caso haremos lo mismo que hicimos para las Apps con más de 4,5 de rating en ambas tiendas, para conocer el porcentaje de Apps en el grupo de las peor valoradas según su valor esperado.
En este caso, cuanto menos porcentaje de Apps de una Categoría concreta existan respecto al valor esperado, mejor valoración general habrá obtenido dicha Categoría.
# Realizamos las operaciones entre ambas tiendas
des_total_menos_2 = (des_apple_menos_2_stars.sort_index() + des_google_menos_2_stars.sort_index()) / 2
des_total_menos_2.sort_values()
# Visualizamos los resultados
# Paleta de colores para hacer un efecto degradado
colores = ['#6B080C', '#6B080C', '#6B080C', '#6B080C', '#6B3E0C', '#6B3E0C', '#6B3E0C',
'#6B560C', '#6B560C', '#6B560C', '#6B760C', '#6B760C', '#6B760C',
'#6BA10C', '#6BA10C', '#6BA10C', '#6BD00C', '#6BD00C', '#6BD00C',
'#6BF20C', '#6BF20C', '#6BF20C']
# Figura de Plotly
fig = go.Figure()
# Trace (barras horizontales)
fig.add_trace(go.Bar(
y = des_total_menos_2.sort_values(ascending=False).index,
x = des_total_menos_2.sort_values(ascending=False),
marker_color = colores,
orientation='h'))
# Título, subtítulo y tamaño
fig.update_layout(title='Valor Real Vs. Valor Esperado - Categorías (menos de 2,5 de rating) <br><sup>Rendimiento total por Categorías en Ambas Stores- Porcentajes (Menos es mejor)',
height=800, width=800)
fig.show()
Mejores y Peores Categorías respecto al Valor Esperado entre las Apps peor valoradas (menos de 2,5 de rating):
Las mejores:
Las peores:
Una vez que hemos analizado a fondo las distintas Categorías, vamos a realizar un resumen de los resultados que hemos obtenido:
Categorías con mejor valoración media entre ambas tiendas:
Categorías con más presencia de la esperada entre las mejor valoradas (4,5 de rating o más):
Categorías con menos presencia de la esperada entre las peor valoradas (menos de 2,5 de rating):
Las siguientes Categorías son las que mejores resultados han obtenido:
Categorías con peor valoración media entre ambas tiendas:
Categorías con menos presencia de la esperada entre las mejor valoradas (4,5 de rating o más):
Categorías con más presencia de la esperada entre las peor valoradas (menos de 2,5 de rating):
Las siguientes Categorías son las que peores resultados han obtenido:
Vamos a ver ahora el número de reseñas de los usuarios por Categorías.
En ambos datasets tenemos datos sobre el número de reseñas o valoraciones que tuvo cada App.
Lo que nos interesará conocer es si existen Categorías donde los usuarios tiendan más a dar su opinión o a valorarlas. Sería positivo encontrar aquellas Categorías que tengan una gran cantidad de valoraciones (en relación a su presencia total) y que además estén bien valoradas.
Para calcular esto, necesitamos saber qué proporción ocupa cada Categoría sobre el total de Apps, y después calcular qué proporción ocupan las reseñas totales recibidas por dicha Categoría sobre el total.
Vamos a crear un nuevo dataset que contendrá datos interesantes sobre las reseñas recibidas para cada una de las Categorías:
# Apple: DataFrame de Categorías y Reseñas
grupos_apple_resenas = apple.groupby('primary_genre').agg({'app_name': 'count', 'total_number_of_ratings': 'sum'})
grupos_apple_resenas['ratings_per_app'] = grupos_apple_resenas['total_number_of_ratings'] / grupos_apple_resenas['app_name']
grupos_apple_resenas['total_ratings'] = 217337260.5
grupos_apple_resenas['rating_pct_total'] = (grupos_apple_resenas['total_number_of_ratings'] /
grupos_apple_resenas['total_ratings']) * 100
grupos_apple_resenas = grupos_apple_resenas.sort_index()
grupos_apple_resenas['pct_apps_per_category'] = (apple.primary_genre.value_counts(normalize=True)*100).sort_index()
grupos_apple_resenas = grupos_apple_resenas.rename(columns={'app_name': 'num_apps',
'total_number_of_ratings': 'reseñas_totales_categ',
'ratings_per_app': 'reseñas_por_app',
'total_ratings': 'reseñas_totales_data',
'rating_pct_total': 'porc_reseñas_totales',
'pct_apps_per_category': 'porc_apps_sobre_total'})
grupos_apple_resenas['variacion_porc_reseñas'] = ((grupos_apple_resenas['porc_reseñas_totales'] /
grupos_apple_resenas['porc_apps_sobre_total']) * 100) - 100
grupos_apple_resenas
# Google: DataFrame de Categorías y Reseñas
grupos_google_resenas = google.groupby('category').agg({'app_name': 'count', 'rating_count': 'sum',
'maximum_installs':'sum'})
grupos_google_resenas['reseñas_por_app'] = grupos_google_resenas['rating_count'] / grupos_google_resenas['app_name']
grupos_google_resenas['reseñas_totales_data'] = 831232521
grupos_google_resenas['porc_reseñas_totales'] = (grupos_google_resenas['rating_count'] /
grupos_google_resenas['reseñas_totales_data']) * 100
grupos_google_resenas = grupos_google_resenas.sort_index()
grupos_google_resenas['porc_sobre_instalaciones_tot'] = (grupos_google_resenas['maximum_installs'] / 118403380055)*100
grupos_google_resenas['porc_apps_sobre_total'] = (google.category.value_counts(normalize=True)*100).sort_index()
grupos_google_resenas = grupos_google_resenas.rename(columns={'rating_count': 'reseñas_totales_categ',
'maximum_installs': 'instalaciones_tot_categ'})
grupos_google_resenas['variacion_porc_reseñas'] = ((grupos_google_resenas['porc_reseñas_totales'] /
grupos_google_resenas['porc_apps_sobre_total']) *100) - 100
grupos_google_resenas
Las estadísticas que vamos a mostrar ahora son sobre el número de reseñas que tienen de media las Categorías.
En general, un gran número de reseñas no está necesariamente asociado a un resultado positivo. Estas estadísticas están íntimamente relacionadas con las estadísticas de valoraciones que venimos mostrando durante todo el Notebook.
Si una Categoría de Apps recibe muchas reseñas e instalaciones, y sus ratings medios son altos, lo catalogaremos como un resultado muy positivo. Si recibe pocas reseñas e instalaciones y sus ratings medios son altos, también lo asumiremos como un resultado positivo, porque el usuario que esté satisfecho con una App no necesariamente va a escribir una reseña o a valorar la App en la tienda.
Por el contrario, si una App recibe muchas reseñas y sus ratings medios son bajos, sí tomaremos los resultados como negativos, y lo mismo para un número pequeño de reseñas: si los ratins medios son bajos, también tomaremos los resultados como negativos.
Hay que tener cuidado a la hora de valorar el número de reseñas de cada Categoría. Existen Categorías (como veremos) que están orientadas hacia un público más joven que es más propenso a escribir reseñas o valorar la App que el público más maduro.
No obstante, vamos a mostrar las estadísticas que hemos recabado:
apple_res_por_app = grupos_apple_resenas['reseñas_por_app'].sort_values(ascending=False)
apple_res_por_app
google_res_por_app = grupos_google_resenas['reseñas_por_app'].sort_values(ascending=False)
google_res_por_app
# Hacemos dos subplots y destacamos las Categorías de Apps con más reseñas medias
apple_res_por_app['color'] = np.where(apple_res_por_app > 4000, '#FFBC1F', 'blue')
google_res_por_app['color'] = np.where(google_res_por_app > 8000, '#FFBC1F', 'green')
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))
# Dos traces
fig.append_trace(go.Bar(x = apple_res_por_app.index,
y = apple_res_por_app,
marker_color = apple_res_por_app['color'],
name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = google_res_por_app.index,
y = google_res_por_app,
marker_color = google_res_por_app['color'],
name = 'Google Play'), row=2, col=1)
# Configuramos los ejes
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)
fig.update_yaxes(row=1, col=1)
fig.update_yaxes(row=2, col=1)
# Título y tamaño
fig.update_layout(showlegend=False,
title_text="Categorías: Número de reseñas medias por App",
height=1000, width=800)
fig.show()
Las mejores Categorías según las valoraciones de los usuarios fueron:
Vamos a ver el número de reseñas recibidas por estas Categorías respecto del porcentaje que representan sobre el total:
apple_porc_resenas = grupos_apple_resenas.loc[['Books & Reference', 'Finance', 'Medical', 'Business', 'Shopping'],
['porc_apps_sobre_total', 'porc_reseñas_totales',
'variacion_porc_reseñas']].sort_values(by='variacion_porc_reseñas', ascending=False)
apple_porc_resenas
google_porc_resenas = grupos_google_resenas.loc[['Books & Reference', 'Finance', 'Medical', 'Business', 'Shopping'],
['porc_apps_sobre_total', 'porc_reseñas_totales',
'variacion_porc_reseñas']].sort_values(by='variacion_porc_reseñas', ascending=False)
google_porc_resenas
# Hacemos dos subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))
# Dos traces
fig.append_trace(go.Bar(x = apple_porc_resenas.index,
y = apple_porc_resenas['variacion_porc_reseñas'],
marker_color = 'blue',
name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = google_porc_resenas.index,
y = google_porc_resenas['variacion_porc_reseñas'],
marker_color = 'green',
name = 'Google Play'), row=2, col=1)
# Configuramos los ejes
#fig.update_xaxes(row=1, col=1, tickangle=-45)
#fig.update_xaxes(row=2, col=1, tickangle=-45)
fig.update_yaxes(row=1, col=1)
fig.update_yaxes(row=2, col=1)
# Título y tamaño
fig.update_layout(showlegend=False,
title_text="TOP Categorías: Reseñas<br><sup>Porcentaje de Reseñas recibidas respecto del número de Apps sobre el total",
height=1000, width=800)
fig.show()
Vemos claramente que la Categoría Shopping es la que más reseñas recibe de los usuarios en relación al porcentaje de Apps de Shopping que existen sobre el total, seguido de Finance.
Medical sería la que menos interés genera a la hora de escribir valoraciones, seguida de Business y Books & Reference.
Ya que disponemos de datos sobre desarrolladores de Apps, vamos a intentar obtener información sobre los mismos.
Veremos los desarrolladores mejor y peor valorados por los usuarios, y después veremos las Categorías de Apps de estos grupos de desarrolladores, para comprobar si alguna empresa de desarrollo de Apps está valorada por encima de la media, y averiguar qué tipo de Apps desarrolla.
# APPLE: Los 25 desarrolladores de las mejores Categorías mejor valorados
# con más de 5 Apps en el mercado y más de 500 valoraciones medias por App
mejores_categorias = ['Books & Reference', 'Finance', 'Medical', 'Business', 'Shopping']
apple_por_desarroladores = apple.groupby(['developer', 'primary_genre']).agg({'app_name': 'count',
'total_number_of_ratings': 'mean',
'total_average_rating': 'mean'})
# Sacamos 'primary_genre' del index para poder filtrar (está en level=1)
apple_por_desarroladores = apple_por_desarroladores.reset_index(level=1)
apple_top_desarrolladores = apple_por_desarroladores[(apple_por_desarroladores.app_name > 5) &
(apple_por_desarroladores.total_number_of_ratings > 500) &
(apple_por_desarroladores.primary_genre.isin(mejores_categorias))].sort_values(by='total_average_rating',
ascending=False).head(25)
apple_top_desarrolladores
# Creamos un gráfico de dispersión
fig = px.scatter(apple_top_desarrolladores,
x = apple_top_desarrolladores.index,
y = 'total_average_rating',
size = 'app_name',
color = 'primary_genre')
fig.update_xaxes(tickangle=-45, title='Desarrollador')
fig.update_yaxes(title='Puntuación Media')
fig.update_layout(showlegend=True,
title_text="App Store - Top Categorías: Desarrolladores<br><sup>Número de Apps y Valoraciones Medias por Desarrollador y tipo de App",
height=700, width=900)
fig.show()
# GOOGLE: Los 25 desarrolladores de las mejores Categorías mejor valorados
# con más de 5 Apps en el mercado y más de 300 valoraciones medias por App
mejores_categorias = ['Books & Reference', 'Finance', 'Medical', 'Business', 'Shopping']
google_por_desarroladores = google.groupby(['developer_id', 'category']).agg({'app_name': 'count',
'rating_count': 'mean',
'rating': 'mean'})
# Sacamos 'category' del index para poder filtrar (está en level=1)
google_por_desarroladores = google_por_desarroladores.reset_index(level=1)
google_top_desarrolladores = google_por_desarroladores[(google_por_desarroladores.app_name > 5) &
(google_por_desarroladores.rating_count > 500) &
(google_por_desarroladores.category.isin(mejores_categorias))].sort_values(by='rating',
ascending=False).head(25)
google_top_desarrolladores
# Creamos un gráfico de dispersión
fig = px.scatter(google_top_desarrolladores,
x = google_top_desarrolladores.index,
y = 'rating',
size = 'app_name',
color = 'category')
fig.update_xaxes(tickangle=-45, title='Desarrollador')
fig.update_yaxes(title='Puntuación Media')
fig.update_layout(showlegend=True,
title_text="Google Play - Top Categorías: Desarrolladores<br><sup>Número de Apps y Valoraciones Medias por Desarrollador y tipo de App",
height=700, width=900)
fig.show()
Parece que los desarrolladores de Apps de Libros son los mejor valorados en general, y concretamente hay muchísimas Apps que son Biblias, ya sean de una religión u otra.
Las valoraciones medias de este tipo de App en Google Play Store llaman mucho la atención. De los 25 desarrolladores más valorados —que cumplen con los criterios que hemos establecido para filtrar— 24 son desarrolladores de Libros, y al menos la mitad de ellos se dedican en exclusiva a libros de tipo religioso.
La nota media mínima de estos desarrolladores es 4,58 sobre 5, una nota altísima en comparación con la nota media mínima en el dataset de Apple (3,07 sobre 5).
Está claro que una App relacionada con la Biblia o con contenido religioso en general es una App que encaja perfectamente con los requisitos de nuestra empresa, ya que es una App barata y sencilla de desarrollar y de mantener, que puede recibir anuncios perfectamente, y que como estamos viendo recibe unas valoraciones medias espectaculares.
Vamos a profundizar un poco en este tipo de Apps.
Como hemos dicho, una App tipo Biblia o de contenido religioso es una App que se adapta perfectamente a los requisitos que nos impuso la empresa a la hora de realizar el análisis.
Vamos a estudiar un poco más en detalle este tipo de Apps.
Vamos a filtrar todas las Apps de tipo libro que contengan en su nombre la palabra 'Biblia' o derivados:
# APPLE: Creamos un DataFrame que contenga Apps de tipo religioso
religion = ['Bible', 'Biblia', 'bible', 'biblia', 'Christ', 'christ', 'Coran', 'Corán', 'Koran', 'koran', 'allah',
'Allah', 'Alá', 'alá', 'Religion', 'religion', 'Religión', 'religión', 'new testament', 'New Testament',
'New testament', 'Nuevo Testamento', 'Nuevo testamento', 'nuevo testamento', 'Gospel', 'gospel',
'evangelio', 'Evangelio', 'Evangelios', 'evangelios', 'Jesus', 'Jesús', 'jesus', 'jesús',
'Iglesia', 'iglesia', 'Church', 'church', 'Misa', 'misa']
apple_biblias = apple[(apple.app_name.str.contains('|'.join(religion))) & (apple.primary_genre == 'Books & Reference')]
apple_biblias = apple_biblias[['app_name', 'total_average_rating', 'total_number_of_ratings']].reset_index(drop=True)
apple_biblias
# GOOGLE: Creamos un DataFrame que contenga Apps de tipo religioso
google_biblias = google[google.app_name.str.contains('|'.join(religion)) & (google.category == 'Books & Reference')]
google_biblias = google_biblias[['app_name', 'rating', 'rating_count', 'maximum_installs']].reset_index(drop=True)
google_biblias
# Apple: Medias de todo el Dataset
apple['total_average_rating'].mean()
# Apple: Medias de Apps Religiosas
apple_biblias['total_average_rating'].mean()
# Google: Medias de todo el Dataset
google['rating'].mean()
# Google: Medias de Apps Religiosas
google_biblias['rating'].mean()
# Graficamos los resultados
tiendas = ['App Store', 'Google Play']
ratings_data = [3.6295, 4.137]
ratings_reli = [4.2609, 4.5076]
# Figura de Plotly
fig = go.Figure(data=[
go.Bar(showlegend=False, name='Apple',text=ratings_data, x=tiendas, y=ratings_data, marker_color=['blue', 'green']),
go.Bar(name='Libros religiosos',text=ratings_reli, x=tiendas, y=ratings_reli, marker_color='red')
])
fig.update_traces(texttemplate='%{text:.3s}', textposition='outside')
fig.update_layout(barmode='group',
showlegend=True,
title="Valoraciones Medias: Apps Religiosas Vs. Resto de Categorías")
fig.update_yaxes(range=[3.2, 4.8])
fig.show()
Las Apps de contenido religioso obtuvieron unos ratings medios muy superiores a los del resto de Categorías en general. Concretamente, en la App Store 0,63 más de rating, y en Google Play 0,37 de rating.
apple[apple.primary_genre == 'Books & Reference']['total_average_rating'].mean()
google[google.category == 'Books & Reference']['rating'].mean()
# Graficamos los resultados
tiendas = ['App Store', 'Google Play']
ratings_data = [3.942, 4.188]
ratings_reli = [4.2609, 4.5076]
# Figura de Plotly
fig = go.Figure(data=[
go.Bar(showlegend=False, text=ratings_data, x=tiendas, y=ratings_data, marker_color=['blue', 'green']),
go.Bar(name='Libros religiosos',text=ratings_reli, x=tiendas, y=ratings_reli, marker_color='red')
])
fig.update_traces(texttemplate='%{text:.3s}', textposition='outside')
fig.update_layout(barmode='group',
showlegend=True,
title="Valoraciones Medias: Apps Religiosas Vs. Resto de Apps de Libros")
fig.update_yaxes(range=[3.7, 4.7])
fig.show()
Al igual que al compararlas con el resto de Categorías, si las comparamos con Books & Reference, las Apps de contenido religioso obtuvieron unos ratings medios muy superiores a éstos. Recordemos que Books & Reference fue una de las Categorías mejor valoradas de todos nuestros datos.
Como ya tenemos localizadas las mejores Categorías de Apps, vamos a comparar los ratings medios de las Apps religiosas Vs los ratings medios de las mejores Categorías. Estas Categorías eran:
Categorías con mejor valoración media entre ambas tiendas:
Como ya hemos comparado las Apps religiosas con el resto de 'Books & Reference', vamos a compararlas con las otras cuatro.
# APPLE
print('APPLE:')
print(f"- Rating Medio Finance: {apple[apple.primary_genre == 'Finance']['total_average_rating'].mean()}")
print(f"- Rating Medio Medical: {apple[apple.primary_genre == 'Medical']['total_average_rating'].mean()}")
print(f"- Rating Medio Business: {apple[apple.primary_genre == 'Business']['total_average_rating'].mean()}")
print(f"- Rating Medio Shopping: {apple[apple.primary_genre == 'Shopping']['total_average_rating'].mean()}")
# GOOGLE
print('GOOGLE:')
print(f"- Rating Medio Finance: {google[google.category == 'Finance']['rating'].mean()}")
print(f"- Rating Medio Medical: {google[google.category == 'Medical']['rating'].mean()}")
print(f"- Rating Medio Business: {google[google.category == 'Business']['rating'].mean()}")
print(f"- Rating Medio Shopping: {google[google.category == 'Shopping']['rating'].mean()}")
# Generamos el Gráfico
fig = go.Figure()
fig.add_trace(go.Bar(name='Finance', x=['App Store', 'Google Play'], y=[4.013, 4.103],
legendrank=1, marker_color='blue'))
fig.add_trace(go.Bar(name='Medical', x=['App Store', 'Google Play'], y=[3.818, 4.285],
legendrank=2, marker_color='orange'))
fig.add_trace(go.Bar(name='Business', x=['App Store', 'Google Play'], y=[3.841, 4.195],
legendrank=3, marker_color='black'))
fig.add_trace(go.Bar(name='Shopping', x=['App Store', 'Google Play'], y=[3.836, 4.178],
legendrank=4, marker_color='green'))
fig.add_trace(go.Bar(name='Apps Religiosas', x=['App Store', 'Google Play'], y=[4.260, 4.507],
legendrank=5, marker_color='red'))
fig.update_yaxes(range=[3.6, 4.6])
fig.update_layout(title="Valoraciones Medias: Apps Religiosas Vs. Las Mejores Apps")
fig.show()
Lo mismo ocurre al comparar las Apps de contenido religioso con el resto de Categorías TOP. Los ratings medios son superiores de forma clara.
Nuestra intuición nos dice que este tipo de Apps son aptas para todos los públicos, pero no obstante vamos a corroborarlo:
# DataFrames
apple_religion = apple[(apple.app_name.str.contains('|'.join(religion))) & (apple.primary_genre == 'Books & Reference')]
google_religion = google[google.app_name.str.contains('|'.join(religion)) & (google.category == 'Books & Reference')]
# Apple: Público
apple_religion.age_rating.value_counts()
# Filtramos las edades sospechosas para encontrar Apps extrañas
apple_religion[apple_religion.age_rating.isin(['17+', '12+'])]
Vemos que a la hora de realizar el filtrado en la lista de palabras religiosas que creamos anteriormente, se han colado algunas Apps que nada tienen que ver con la religión, pero la cantidad es mínima, y por los ratings que observamos, vemos que en caso de que pudiesen influir en los ratings medios, si eliminásemos estas Apps extrañas, seguramente los ratings de las Apps religiosas serían hasta mayores de lo que ya son. Por tanto concluimos que el age rating dependerá de cada desarrollador, o incluso de la legislación vigente en algún país concreto (dejamos el dato en el aire porque no lo conocemos, son solo hipótesis).
# Google: Público
google_religion.age.value_counts()
google_religion[google_religion.age.isin(['Mature 17+', 'Teen'])].head(10)
Al igual que en Apple, concluimos que las edades nada tienen que ver con la presencia de Apps extrañas —que no pertenezcan al subgénero religioso—.
Vamos a ver ahora qué cantidad de Apps actualizadas existen en cada DataFrame.
Cada dataset fue recopilado en épocas distintas:
Vamos a establecer criterios para determinar si una App está actualizada o no. Consideraremos una App actualizada si recibió alguna actualización en el último año, y consideraremos que una App está en desuso si la última actualización recibida fue anterior a este periodo.
Vamos a filtrar las Apps en ambos DataFrames:
# APPLE: Apps religiosas totales en el dataset
len(apple_religion.index)
# APPLE: Apps cuya última actualización fue en 2019 o 2020
apple_religion_actualizadas = apple_religion[(apple_religion.last_update.str.contains('2019')) |
(apple_religion.last_update.str.contains('2020'))]
len(apple_religion_actualizadas.index)
# GOOGLE: Apps religiosas totales en el dataset
len(google_religion.index)
Los datos de Google fueron recabados en el mes de Junio, por lo que si incluimos tanto 2020 como 2021, estaríamos abarcando un periodo de tiempo de 18 meses, lo que es excesivo.
Vamos a crear una lista con 12 strings, que serán todas las fechas válidas para nosotros.
# GOOGLE: Apps cuya última actualización fue recibida en el periodo de los últimos 14 meses
meses = ['Jun-2020', 'Jul-2020', 'Aug-2020', 'Sep-2020', 'Oct-2020',
'Dec-2020', 'Jan-2021', 'Feb-2021', 'Mar-2021', 'Apr-2021', 'May-2021', 'Jun-2021']
google_religion_actualizadas = google_religion[google_religion.last_updated.isin(meses)]
len(google_religion_actualizadas.index)
Tenemos 162 Apps de carácter religioso en la App Store, y 850 en la Play Store.
Esto significa que tenemos poco más de 1000 Apps que recibieron alguna actualización en algún momento de los doce meses anteriores a la construcción de los datasets.
Podríamos filtrar más para comprobar cuáles están realmente actualizadas y cuáles no, pero 1000 Apps es un número suficientemente pequeño comparado con las casi 400,000 Apps de las que partíamos (aproximadamente el 0,25% de las Apps totales).
Esto quiere decir que si creamos una App competitiva (aunque destinemos un presupuesto relativamente bajo a su desarollo), es posible obtener beneficios de ella, y en su defecto, tampoco supondría una gran pérdida.
Lo que está claro es que las Apps con una temática religiosa son una excelente opción si queremos desarrollar una App barata, que permita publicidad y que pueda ser lanzada en cualquier mercado.
Hemos analizado los datos que tenemos desde varias perspectivas.
Vimos las Apps mejor y peor valoradas por los usuarios, tanto en valores absolutos como el valor esperado. La Categoría Books & Reference siempre estuvo entre las mejor valoradas, y encajaba perfectamente con el tipo de App que nuestra empresa quiere desarrollar, pero no teníamos ninguna conclusión clara.
Analizamos los desarrolladores de Apps para poder tomarlos como referencia, y nos dimos cuenta de que los mejor valorados se dedicaban a desarrollar Apps tipo libro o audiolibro, y más concretamente de contenido religioso.
Profundizamos un poco más en este subgénero, y nos dimos cuenta de que las valoraciones medias que obtienen este tipo de Apps son superiores a todas las demás Categorías, con márgenes bastante fuertes.
Este tipo de App cumple todos los requisitos que nos impuso nuestra empresa:
Además, cuenta con otras ventajas adicionales, como: